// 设置图片请求头
layui.define(['jquery', 'configure', 'sessionFun', 'configureCom', 'bluebird'], function (exports) {
    var $ = layui.jquery,
        configure = layui.configure,
        configureCom = layui.configureCom,
        layer = layui.layer;
    var setHeader = function (object, data, headers) {
        if (IEVersion() != -1) {
            headers['Access-Control-Allow-Origin'] = '*';
            headers['Access-Control-Request-Headers'] = 'content-type';
            headers['Access-Control-Request-Method'] = 'POST';
        } else {
            return false;
        }
    };

    var server = configure.ATTA_UPLOAD_HTTP; //上传服务器地址
    var deleteFileHttp = configure.ATTA_DELETE_HTTP;//删除附件地址
// //上传uploader入口配置传递参数
    var fileData = {};
    var fileSingleNumLimit = 40; // 单个文件上传总数
    var fileMoreNumLimit = 20; // 多个文件上传总数

    var uploadCommon = {
        uploadreInt: function (className, i, v) {
            var fileSizeLimit = 1024 * 1024 * v.sizeTotalMax / 1024; // 文件总大小限制
            var fileSingleSizeLimit = 1024 * 1024 * v.sizeSingleMax / 1024; // 单个文件大小限制
            var multiple = false;
            if (v.countMax > 1) {
                multiple = true;
            }
            var mimeTypes = [];
            var types;
            if (v.suffixs) {
                types = v.suffixs.split(',');
                $.each(types, function (ind, val) {
                    mimeTypes.push('.' + val);
                });
            }
            mimeTypes = mimeTypes.join(',');
            // 初始化Web Uploader
            var uploader = WebUploader.create({
                // 选完文件后，是否自动上传。
                auto: true,
                // swf文件路径
                swf: '../../dist/Uploader.swf',
                // 文件接收服务端。
                server: server,
                formData: fileData,
                // 选择文件的按钮。可选。
                // 内部根据当前运行是创建，可能是input元素，也可能是flash.
                pick: {
                    id: '.' + className,
                    multiple: multiple
                },
                fileNumLimit: fileSingleNumLimit,
                fileSizeLimit: fileSizeLimit,
                fileSingleSizeLimit: fileSingleSizeLimit,
                duplicate: false,
                chunked: false,
                // 只允许选择图片文件。
                accept: {
                    // title: 'Images',
                    title: 'Img',
                    extensions: v.suffixs || '*',
                    mimeTypes: mimeTypes
                }
            });
            //修改请求头，添加token
            uploader.on('uploadBeforeSend', function (obj, data, headers) {
                headers.Authorization = token;
            });

            //监听错误
            uploader.on('error', function (type) {
                if (type == 'Q_TYPE_DENIED') {
                    layer.msg('请上传' + v.suffixs + '格式文件');
                } else if (type == 'F_EXCEED_SIZE' || type == 'Q_EXCEED_SIZE_LIMIT') {
                    //后期需要从后台返回的大小限制获取并提示
                    //layer.msg("文件大小不能超过" + fileSingleSizeLimit + "M");
                    layer.msg('单个文件大小不能超过' + v.sizeSingleMax / 1024 + 'M,总大小不能超过' + v.sizeTotalMax / 1024 + 'M');
                } else if(type == 'F_DUPLICATE'){
                    layer.msg('文件重复');
                }else {
                    layer.msg('上传出错！请检查后重新上传！错误代码' + type);
                }
            });
// 当有文件添加进来的时候
            uploader.on('fileQueued', function (file, percentage) {
                //找到当前操作按钮最顶级
                eventTarget = file.source._refer;
                //是否有重复上传
                var repeatMsg = '';
                var hasFj = eventTarget.parent().find('.fileNameTxt');
                $.each(hasFj, function (i, v) {
                    if ($(this).html() === file.name) {
                        repeatMsg = '重复上传';
                        return false;
                    }
                });
                if (repeatMsg) {
                    top.layer.msg(repeatMsg);
                    return false;
                }

                //找到name参数所在元素，获取name参数
                fileDataName = eventTarget.attr('data-name');
                //修改上传参数为获取name参数
                uploader.options.formData.fileNameType = fileDataName;
                //找到num参数所在元素，获取num参数
                fileDataNum = eventTarget.attr('data-num');
                //修改上传参数的最大上传数量为获取的数量
                uploader.options.formData.fileNumLimit = fileDataNum;
                //html片段，进度条和文件名显示
                var $li = $(
                    '<div id="' + file.id + '" class="file-item thumbnail">' +
                    '<div class="progress">' +
                    '        <span class="text">0%</span>' +
                    '        <span class="percentage"></span>' +
                    '</div>' +
                    '</div>'
                );
                if (multiple) {
                    eventTarget.find('.webuploader-pick').html('继续上传');
                } else {
                    //如果没有隐藏上传按钮，则隐藏
                    if (eventTarget.find('.webuploader-pick').css('display') != 'none') {
                        eventTarget.find('.webuploader-pick').addClass('webuploader-element-invisible');
                        eventTarget.find('.webuploader-pick').next().addClass('webuploader-element-invisible');
                    }
                }
                // $list为容器jQuery实例
                eventTarget.append($li);
            });
// 文件上传过程中创建进度条实时显示。
            uploader.on('uploadProgress', function (file, percentage) {
                var $li = $('#' + file.id),
                    $percent = $li.find('.progress span');
                // 避免重复创建
                if (!$percent.length) {
                    $percent = $('<p class="progress"><span></span></p>')
                        .appendTo($li)
                        .find('span');
                }
                $li.find('span.text').html(parseInt(percentage * 100) + '%');
                $percent.css('width', percentage * 100 + '%');
            });

//发送请求前，修改请求头部
            uploader.on('uploadBeforeSend', setHeader);

// 文件上传成功，给item添加成功class, 用样式标记上传成功。
            uploader.on('uploadSuccess', function (file, res) {
                var response = res.result;
                var tmpId = $('#' + file.id).parent().attr('data-tmpId');
                var fileNameHttp = '<div class="info">' +
                    '<span class="fileNameTxt" data-tmpId="' + tmpId + '" data-attaId="" data-id="' + response.objectId + '" data-url="' + response.fileName + '">' + file.name + '</span>' +
                    '<span data-name="' + response.fileName + '" class="fileDelete">x</span>' +
                    '</div>';
                $('#' + file.id).append(fileNameHttp);
                //绑定删除按钮事件
                $('#' + file.id).on('click', '.fileDelete', function () {
                    //获取删除按钮上的文件id
                    var id = $(this).attr('data-id');
                    //找到顶层父容器
                    var $parentBox = $(this).parents('.webuploader-container');
                    //找到需删除的文本
                    var $fileItem = $(this).parents('.file-item');
                    var fileName = $(this).attr('data-name');
                    //调用删除接口方法
                    var ajaxData = {fileName: fileName};
                    fileDelete(ajaxData, deleteFileHttp).then(function (res) {
                        if (res.code == 1) {
                            //清空uplpoader文件上传内容
                            uploader.removeFile(file);
                            //删除该文件名区域
                            $fileItem.remove();
                            //开启上传按钮
                            $parentBox.children().removeClass('webuploader-element-invisible');
                        }
                        layer.msg(res.msg, {time: 1000});
                    });
                });
                if (response) {
                    $('#' + file.id).find('.fileDelete').attr('data-id', response.objectId);
                } else {
                    layer.msg('上传失败！');
                }
                $('#' + file.id).addClass('upload-state-done');
            });

// 文件上传失败，显示上传出错。
            uploader.on('uploadError', function (file, reason) {
                layer.msg('上传失败!');
                //显示出上传按钮
                $('#' + file.id).siblings().removeClass('webuploader-element-invisible');
            });

            // 完成上传完了，成功或者失败，先删除进度条。
            uploader.on('uploadComplete', function (file) {
                $('#' + file.id).find('.progress').remove();
            });

        }
    };

//删除文件方法
    function fileDelete(data, http) {
        return new Promise(function (resolve, reject) {
            configureCom.deleteAjax(http + data.fileName, {}).then(function (res) {
                if (res.code == 1) {
                    resolve({code: 1, msg: '删除成功'});
                } else {
                    resolve({code: 0, msg: '删除失败'});
                }
            });
        });
    }

    //加载页面时的删除方法
    window.showDeleteFile = function (event) {
        var $this = $(event);
        //删除事件所在的文件名容器
        var $parentBox = $this.parents('.file-item');
        //获取该文件类别
        var tmpId = $this.attr('data-tmpId');
        var fileName = $this.attr('data-name');
        //该文件类别容器容器
        // var $topBox = $('.' + fileNameAttr);
        var $topBox = $('div[data-tmpId=' + tmpId + ']');
        var ajaxData = {fileName: fileName};
        fileDelete(ajaxData, deleteFileHttp).then(function (res) {
            if (res.code == 1) {
                //删除是视图上的该文件名容器
                $parentBox.remove();
                //文件容器下，文件名容器的数量，如果等于0，放开上传
                if ($topBox.find('.file-item').length == 0) {
                    $topBox.first().removeClass('webuploader-element-invisible');
                }
            }
            layer.msg(res.msg);
        });
    };

// //在关闭页面时，未保存的文件全部删除，未保存的文件data-id没有，以此判断
//     function deleteAllDissSave() {
//         return new Promise(function (resolve, reject) {
//             //定义未保存文件数组
//             var dissSaveFileArr = [];
//             $('.fileDelete').each(function (i, p) {
//                 //如果文件名有dataid，并且没有已保存标志，则加入删除数组
//                 if ($(p).attr('data-id') && !($(p).hasClass('saved'))) {
//                     dissSaveFileArr.push($(p).attr('data-id'));
//                 }
//             });
//             //判断删除数组是否为空
//             if (dissSaveFileArr.length == 0) {
//                 //将未保存文件数组转化为json字符串
//                 dissSaveFileArr = JSON.stringify(dissSaveFileArr);
//                 //将需删除的id数组发送出去
//                 resolve({code: 0, msg: dissSaveFileArr});
//             } else {
//                 //将未保存文件数组转化为json字符串
//                 dissSaveFileArr = JSON.stringify(dissSaveFileArr);
//                 //将需删除的id数组发送出去
//                 resolve({code: 1, msg: dissSaveFileArr});
//             }
//         });
//     }
    function IEVersion() {
        var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
        var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1; //判断是否IE<11浏览器
        var isEdge = userAgent.indexOf("Edge") > -1 && !isIE; //判断是否IE的Edge浏览器
        var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1;
        if (isIE) {
            var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
            reIE.test(userAgent);
            var fIEVersion = parseFloat(RegExp["$1"]);
            if (fIEVersion == 7) {
                return 7;
            } else if (fIEVersion == 8) {
                return 8;
            } else if (fIEVersion == 9) {
                return 9;
            } else if (fIEVersion == 10) {
                return 10;
            } else {
                return 6;//IE版本<=7
            }
        } else if (isEdge) {
            return 'edge';//edge
        } else if (isIE11) {
            return 11; //IE11
        } else {
            return -1;//不是ie浏览器
        }
    }

    exports('uploadCommon', uploadCommon);
});